/**
 * 认证相关工具类
 */
import storage from './storage'
import Cookies from 'js-cookie'

// 存储键定义
const TOKEN_KEY = 'token'
const USER_INFO_KEY = 'user_info'
const PERMISSIONS_KEY = 'permissions'

const TokenKey = 'h_plus_token'

/**
 * 设置认证Token
 * @param {string} token 认证令牌
 * @param {number} expire 过期时间(毫秒)
 */
export function setToken(token, expire) {
  storage.setItem(TOKEN_KEY, token, expire)
  return Cookies.set(TokenKey, token)
}

/**
 * 获取认证Token
 * @returns {string|null} 认证令牌
 */
export function getToken() {
  return Cookies.get(TokenKey)
}

/**
 * 移除认证Token
 */
export function removeToken() {
  storage.removeItem(TOKEN_KEY)
  return Cookies.remove(TokenKey)
}

/**
 * 设置用户信息
 * @param {Object} userInfo 用户信息对象
 */
export function setUserInfo(userInfo) {
  storage.setItem(USER_INFO_KEY, userInfo)
}

/**
 * 获取用户信息
 * @returns {Object|null} 用户信息对象
 */
export function getUserInfo() {
  return storage.getItem(USER_INFO_KEY)
}

/**
 * 移除用户信息
 */
export function removeUserInfo() {
  storage.removeItem(USER_INFO_KEY)
}

/**
 * 设置用户权限
 * @param {Array} permissions 权限列表
 */
export function setPermissions(permissions) {
  storage.setItem(PERMISSIONS_KEY, permissions)
}

/**
 * 获取用户权限
 * @returns {Array|null} 权限列表
 */
export function getPermissions() {
  return storage.getItem(PERMISSIONS_KEY)
}

/**
 * 移除用户权限
 */
export function removePermissions() {
  storage.removeItem(PERMISSIONS_KEY)
}

/**
 * 检查是否有特定权限
 * @param {string} permission 权限代码
 * @returns {boolean} 是否拥有该权限
 */
export function hasPermission(permission) {
  const permissions = getPermissions()
  if (!permissions) return false
  return permissions.includes(permission)
}

/**
 * 清除所有认证相关信息
 */
export function clearAuth() {
  removeToken()
  removeUserInfo()
  removePermissions()
}

/**
 * 检查用户是否已登录
 * @returns {boolean} 登录状态
 */
export function isAuthenticated() {
  return !!getToken()
}

export default {
  setToken,
  getToken,
  removeToken,
  setUserInfo,
  getUserInfo,
  removeUserInfo,
  setPermissions,
  getPermissions,
  removePermissions,
  hasPermission,
  clearAuth,
  isAuthenticated
} 